package server

import (
	v1 "medicine/api/helloworld/v1"
	medicinev1 "medicine/api/medicine/v1"
	"medicine/internal/conf"
	"medicine/internal/service"

	"github.com/go-kratos/kratos/v2/log"
	"github.com/go-kratos/kratos/v2/middleware/recovery"
	"github.com/go-kratos/kratos/v2/transport/grpc"
)

// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server,
	greeter *service.GreeterService,
	product *service.ProductService,
	seckill *service.SeckillService,
	seckillOrder *service.SeckillOrderService,
	category *service.CategoryService,
	brand *service.BrandService,
	user *service.UserService,
	points *service.PointsService,
	logger log.Logger) *grpc.Server {
	var opts = []grpc.ServerOption{
		grpc.Middleware(
			recovery.Recovery(),
		),
	}
	if c.Grpc.Network != "" {
		opts = append(opts, grpc.Network(c.Grpc.Network))
	}
	if c.Grpc.Addr != "" {
		opts = append(opts, grpc.Address(c.Grpc.Addr))
	}
	if c.Grpc.Timeout != nil {
		opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))
	}
	srv := grpc.NewServer(opts...)

	// 注册所有服务
	v1.RegisterGreeterServer(srv, greeter)
	medicinev1.RegisterProductServer(srv, product)
	medicinev1.RegisterSeckillServer(srv, seckill)
	medicinev1.RegisterSeckillOrderServer(srv, seckillOrder)
	medicinev1.RegisterCategoryServer(srv, category)
	medicinev1.RegisterBrandServer(srv, brand)
	medicinev1.RegisterUserServer(srv, user)
	medicinev1.RegisterPointsServer(srv, points)

	return srv
}
